4.3 ResponseWriter
首先创建一个 Response
结构,接着将数据存储到这个结构里面,最后将这个结构返回给客户端——如果你认为服务器是通过这种方式向客户端返回响应的,那么你就错了:服务器在向客户端返回响应的时候,真正需要用到的是 ResponseWriter
接口。
ResponseWriter
是一个接口,处理器可以通过这个接口创建HTTP响应。 ResponseWriter
在创建响应时会用到 http.response
结构,因为该结构是一个非导出(nonexported)的结构,所以用户只能通过 ResponseWriter
来使用这个结构,而不能直接使用它。
为什么要以传值的方式将ResponseWriter传递给ServeHTTP
在阅读了本章前面的内容之后,有的读者可能会感到疑惑——
ServeHTTP
为什么要接受ResponseWriter
接口和一个指向Request
结构的指针作为参数呢?接受Request
结构指针的原因很简单:为了让服务器能够察觉到处理器对Request
结构的修改,我们必须以传引用(pass by reference)而不是传值(pass by value)的方式传递Request
结构。但是另一方面,为什么ServeHTTP
却是以传值的方式接受ResponseWriter
呢?难道服务器不需要知道处理器对ResponseWriter
所做的修改吗? 对于这个问题,如果我们深入探究net/http
库的源码,就会发现ResponseWriter
实际上就是response
这个非导出结构的接口,而ResponseWriter
在使用response
结构时,传递的也是指向response
结构的指针,这也就是说,ResponseWriter
是以传引用而不是传值的方式在使用response
结构。 换句话说,实际上ServeHTTP
函数的两个参数传递的都是引用而不是值——虽然ResponseWriter
看上去像是一个值,但它实际上却是一个带有结构指针的接口。
ResponseWriter
接口拥有以下3个方法:
Write
;WriteHeader
;Header
。